{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用LisaDPF框架，首先包含一些必要的初始化，这部分不需要修改 ＃"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import logging\n",
    "from datetime import datetime\n",
    "from pathlib import Path\n",
    "from functools import reduce, partial\n",
    "from operator import getitem\n",
    "import torch, os\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torchvision.datasets as datasets\n",
    "import torch.utils.data as data\n",
    "import torchvision.transforms as transforms\n",
    "import torchvision.models as models\n",
    "from torchsummary import summary\n",
    "import sys\n",
    "sys.path.append('../../')\n",
    "from logger import setup_logging\n",
    "from trainer import CLSTrainer, accuracy, top_k_acc\n",
    "from utils import prepare_device\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "\n",
    "# String, path to the checkpoint being loaded.\n",
    "resume=None \n",
    "# set save_dir where trained model and log will be saved.\n",
    "save_dir=Path('saved/')\n",
    "exper_name='MNIST'\n",
    "# use timestamp as default run-id\n",
    "run_id = datetime.now().strftime(r'%m%d_%H%M%S')\n",
    "save_period=1\n",
    "n_gpu=1\n",
    "tensorboard=True\n",
    "verbosity=2,\n",
    "early_stop=10\n",
    "arch=''\n",
    "\n",
    "log_dir = save_dir / 'log' / exper_name / run_id\n",
    "save_dir = save_dir / 'models' / exper_name / run_id\n",
    "exist_ok = run_id == ''\n",
    "save_dir.mkdir(parents=True, exist_ok=exist_ok)\n",
    "log_dir.mkdir(parents=True, exist_ok=exist_ok)\n",
    "# configure logging module\n",
    "setup_logging(log_dir, '../../logger/logger_config.json')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义你的dataloader #"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to data/MNIST/raw/train-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f364af47e8a24e368200c48f1966989a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data/MNIST/raw/train-images-idx3-ubyte.gz to data/MNIST/raw\n",
      "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to data/MNIST/raw/train-labels-idx1-ubyte.gz\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d49c1dcf71cf45a2a6713d1ce4299afc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data/MNIST/raw/train-labels-idx1-ubyte.gz to data/MNIST/raw\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to data/MNIST/raw/t10k-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cff2a63616424f7b967114a946af8146",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data/MNIST/raw/t10k-images-idx3-ubyte.gz to data/MNIST/raw\n",
      "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to data/MNIST/raw/t10k-labels-idx1-ubyte.gz\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3b42e83fd7c646219e22cdc376ddbc39",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data/MNIST/raw/t10k-labels-idx1-ubyte.gz to data/MNIST/raw\n",
      "Processing...\n",
      "Done!\n"
     ]
    }
   ],
   "source": [
    "transform=transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.1307,), (0.3081,))\n",
    "        ])\n",
    "    \n",
    "data_dir = 'dataset/'\n",
    "num_workers = {\n",
    "    'train' : 16, # setting zero seems to a good choice rather than 100\n",
    "    'val'   : 16\n",
    "}\n",
    "image_datasets = {\n",
    "    'train': datasets.MNIST('data', train=True, download=True,transform=transform),\n",
    "    'val': datasets.MNIST('data', train=False,transform=transform)\n",
    "}\n",
    "dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=64,\n",
    "                                             shuffle=True, num_workers=num_workers[x])\n",
    "              for x in ['train', 'val']}\n",
    "dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义网络 #"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1           [-1, 32, 26, 26]             320\n",
      "            Conv2d-2           [-1, 64, 24, 24]          18,496\n",
      "           Dropout-3           [-1, 64, 12, 12]               0\n",
      "            Linear-4                  [-1, 128]       1,179,776\n",
      "           Dropout-5                  [-1, 128]               0\n",
      "            Linear-6                   [-1, 10]           1,290\n",
      "================================================================\n",
      "Total params: 1,199,882\n",
      "Trainable params: 1,199,882\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.00\n",
      "Forward/backward pass size (MB): 0.52\n",
      "Params size (MB): 4.58\n",
      "Estimated Total Size (MB): 5.10\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "import torch.nn.functional as F\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 32, 3, 1)\n",
    "        self.conv2 = nn.Conv2d(32, 64, 3, 1)\n",
    "        self.dropout1 = nn.Dropout(0.25)\n",
    "        self.dropout2 = nn.Dropout(0.5)\n",
    "        self.fc1 = nn.Linear(9216, 128)\n",
    "        self.fc2 = nn.Linear(128, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = F.relu(x)\n",
    "        x = self.conv2(x)\n",
    "        x = F.relu(x)\n",
    "        x = F.max_pool2d(x, 2)\n",
    "        x = self.dropout1(x)\n",
    "        x = torch.flatten(x, 1)\n",
    "        x = self.fc1(x)\n",
    "        x = F.relu(x)\n",
    "        x = self.dropout2(x)\n",
    "        x = self.fc2(x)\n",
    "        output = F.log_softmax(x, dim=1)\n",
    "        return output\n",
    "n_gpu=1\n",
    "device, device_ids = prepare_device(n_gpu)\n",
    "model = Net().to(device)\n",
    "summary(model, input_size=(1, 28, 28))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 执行训练 #"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy\n",
      "\ttraining         \t (min:    0.770, max:    0.963, cur:    0.963)\n",
      "\tvalidation       \t (min:    0.916, max:    0.978, cur:    0.978)\n",
      "log loss\n",
      "\ttraining         \t (min:    0.124, max:    0.793, cur:    0.124)\n",
      "\tvalidation       \t (min:    0.070, max:    0.296, cur:    0.070)\n",
      "    epoch          : 10\n",
      "    used_time      : 127.94853520393372\n",
      "    loss           : 0.12438394920801175\n",
      "    accuracy       : 0.9630530383795309\n",
      "    val_loss       : 0.07041988824939083\n",
      "    val_accuracy   : 0.9775079617834395\n",
      "Saving checkpoint: saved/models/MNIST/1206_123543/checkpoint-epoch10.pth ...\n",
      "Saving current best: model_best.pth ...\n"
     ]
    }
   ],
   "source": [
    "# model\n",
    "model = Net().to(device)\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "model  = model.to(device)\n",
    "# loss and metrics\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "metrics=[accuracy]\n",
    "\n",
    "optimizer = optim.Adadelta(model.parameters(), lr=0.01)\n",
    "\n",
    "lr_scheduler = None\n",
    "\n",
    "trainer = CLSTrainer(model, criterion, metrics, optimizer, device, data_loader=dataloaders['train'], \n",
    "                     save_dir=save_dir, log_dir=log_dir,\n",
    "                      valid_data_loader=dataloaders['val'],\n",
    "                      lr_scheduler=lr_scheduler,resume=None,\n",
    "                    verbosity=2, \n",
    "                    n_gpu=n_gpu, \n",
    "                    epochs=10,\n",
    "                    save_period=1, \n",
    "                    monitor='max val_accuracy',\n",
    "                    early_stop=5,\n",
    "                    tensorboard=True)\n",
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
